package com.yong.common.hibernate; 

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map.Entry;

import com.epcool.framework.util.Paging;

/**
 * 泛化DAO接口
 * @param: 		<T> DAO访问的entity类
 * @param: 		<PK> DAO访问的entity主键
 * 
 * @author yz.Wu
 * 
 */
public interface IGenericDao <T, PK extends Serializable> {
	/**
	 * 
	 * @param id
	 * @return id对应的Entity.如果id不存在,返回Null.
	 */
	T get(PK id);
	
	/**
	 * 
	 * @param id
	 * @return
	 */
	T load(PK id);
	
	/**
	 * 
	 * @param id
	 * @return boolean,id对应的Entity是否存在
	 */
	boolean exists(PK id);
	
	/**
	 * 保存或更新
	 * @param object
	 * @return
	 */
	T save(T object);
	
	/**
	 * 删除
	 * @param id
	 */
	void remove(PK id);
	
	void remove(T o);
	
	/**
	 * 查找记录数
	 * @return
	 */
	int getCount(String queryString);
	
	/**
	 * 自定义查找记录数
	 * @param queryString
	 * @param values
	 * @return
	 */
	int getCountByProperties(String queryString, Object... values);
	
	/**
	 * 根据属性查找唯一记录
	 * @param propertyName
	 * @param value
	 * @return
	 */
	T findUniqueByProperty(String propertyName, Object value);
	
	/**
	 * 根据queryString制定多个属性，查找到唯一记录
	 * @param queryString
	 * @param values
	 * @return
	 */
	public T findUniqueByProperties(String queryString, Object... values);
	
	/**
	 * 分页查找
	 * @param startIndex:从0开始
	 * @param pageSize:分页大小，为0时不作分页处理
	 * @return
	 */
	List<T> findAll(int startIndex, int pageSize);
	
	/**
	 * 根据属性分页查找记录.
	 * @param propertyName:属性名称.
	 * @param value:属性值.
	 * @param startIndex:记录序号从0开始
	 * @param pageSize:分页大小，为0时不作分页处理.
	 * @return List
	 */
	List<T> findByProperty(String propertyName, Object value, int startIndex, int pageSize);	
	
	/**
	 * 自定义参数分页查找
	 * @param queryString
	 * @param startIndex:从0开始
	 * @param pageSize:分页大小，为0时不作分页处理
	 * @param values:参数值数数
	 * @return
	 */
	List<T> find(String queryString, int startIndex, int pageSize, Object... values);
	
	
	/**
	 * find don't return typeof T
	 * @param queryString
	 * @param start
	 * @param pageSize
	 * @param values
	 * @return
	 */
	List<?> findNotT(String queryString, int start, int pageSize, Object...values);

	/*以下为y.nie所添加***************************************************************************/
	
	/**
	 * 分页函数，返回包含 总的数目的，以及分页结果的 集合体 
	 * @param queryString
	 * @param startIndex 从0 开始
	 * @param pageSize 分页大小
	 * @param values 参数数组
	 * @return 返回类似于 Map.Entry<总数目,实体集合>的
	 */	
	Entry<Integer, List<T>> pagedFind(String queryString, int startIndex, int pageSize, Object... values);	
	
	/**
	 * 批量更新
	 * @param hql 需要执行的hql语句
	 * @param values
	 * @return
	 */
	int bulkUpdate(String hql, Object... values);
	
	/**
	 * 更新一实体
	 * @param entity
	 */
	void update(T entity);
	
	void mergeUpdate(T entity);

	/**
	 * 保存或更新一实体
	 * @param entity
	 */
	void saveOrUpdate(T entity);

	/**
	 * 批量保存或更新实体集合
	 * @param entities
	 */
	void saveOrUpdateAll(Collection<T> entities);
	
	
	/**
	 * paging method
	 * @param paging 
	 * @param queryString 
	 * @param objects
	 */
	void paging(Paging<T> paging, String queryString, Object...objects);
}
 